package com.lanhai.webservice.config;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
/**
 * 线程池配置
 * @author zhh
 *
 */
@Configuration
@EnableAsync
public class ThreadPoolConfig {

/**
 *   默认情况下，在创建了线程池后，线程池中的线程数为0，当有任务来之后，就会创建一个线程去执行任务，
 *	当线程池中的线程数目达到corePoolSize后，就会把到达的任务放到缓存队列当中；
 *  当队列满了，就继续创建线程，当线程数量大于等于maxPoolSize后，开始使用拒绝策略拒绝 
 */

	/**
	 * 核心线程数（默认线程数）
	 */
	private static final int corePoolSize = 20;
	/**
	 * 最大线程数
	 */
	private static final int maxPoolSize = 100;
	/**
	 * 允许线程空闲时间（单位：默认为秒）
	 */
	private static final int keepAliveTime = 10;
	/**
	 * 缓冲队列大小
	 */
	private static final int queueCapacity = 200;
	/**
	 * 线程池名前缀
	 */
	private static final String threadNamePrefix = "Async-Service-";

	@Bean("MyExecutor") // bean的名称，默认为首字母小写的方法名
	public ThreadPoolExecutor myExecutor() {
		ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize,
				keepAliveTime, TimeUnit.MICROSECONDS, new ArrayBlockingQueue<Runnable>(10000), new ThreadPoolExecutor.CallerRunsPolicy());

		return executor;
	}
}

